package com.kpmg.datalake.web.config;

import com.kpmg.datalake.operatelog.aspect.OperateLogAspect;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
 * @author Alex.zhao [alex.zhao@kpmg.com]
 * @since Created on azhao6 on 2018-08-08 16:07:39 异步任务 日志拦截
 */
@Configuration
@EnableAsync(proxyTargetClass = true)
public class AsyncTaskExecutorConfig {

  @Bean
  public Executor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    //核心线程数
    taskExecutor.setCorePoolSize(50);
    //最大线程数
    taskExecutor.setMaxPoolSize(100);
    //配置队列大小
    taskExecutor.setQueueCapacity(99999);
    //配置线程池中的线程的名称前缀
    taskExecutor.setThreadNamePrefix("async-service-");
    // rejection-policy：当pool已经达到max size的时候，如何处理新任务
    // CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
    taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    //执行初始化
    taskExecutor.initialize();
    return taskExecutor;
  }


  @Bean
  public OperateLogAspect operateLogAspect() {
    return new OperateLogAspect();
  }
}
